// electron / main.ts
import { app, BrowserWindow, ipcMain, dialog, autoUpdater } from "electron";
import { join } from "path";
const path = require("path");
const fs = require("fs");
const si = require('systeminformation');
const logPath = path.join(__dirname, "logs", "app.log");
const { exec } = require('child_process');
// const binding = require(join(__dirname,'../electron/typed_array_to_native.node'))
process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";
process.env.LANG = "zh_CN.UTF-8";
process.env.LANGUAGE = "zh_CN:zh";
autoUpdater.autoDownload = false;
const createWindow = async () => {
	const win = new BrowserWindow({
		width: 1400,
		height: 900,
		frame: true, //隐藏头部
		resizable: false, //用户是否可以调整窗口大小
		show: true, //先不显示窗口，等窗口准备好了才显示，防止渲染未完成时出现白框
		maximizable: false, //禁止双击最大化
		webPreferences: {
			nodeIntegration: true, // 设置是否在页面中启用 Node.js 集成模式
			contextIsolation: false, // 设置是否启用上下文隔离模式。
			certificateTransparency: true,// 其他的webPreferences配置
		},
	});
	// 或者在窗口创建后
	win.webContents.openDevTools();
	if (process.env.VITE_DEV_SERVER_URL) {
		win.loadURL(process.env.VITE_DEV_SERVER_URL);
		// const indexHtml = join(__dirname, '/../dist/index.html')
		// win.loadFile(indexHtml)
	} else {
		console.log(444, join(__dirname));
		const indexHtml = join(__dirname, "/../dist/index.html");
		win.loadFile(indexHtml);
		// win.loadFile('index.html')
	}
	const initLoginWindow = (windowObj) => {
		//去登陆页面
		// win.setSize(680, 430);
		// win.setTitle('登录');
		windowObj.setTitle("登录");
		windowObj.setSize(1400, 900);
		windowObj.setMinimumSize(1400, 900);
		windowObj.setResizable(false);
		windowObj.setMaximizable(false);
		windowObj.center();
	};

	const initMainWindow = (windowObj) => {
		//去首页
		windowObj.setTitle("首页");
		windowObj.setSize(1400, 900);
		windowObj.setMinimumSize(1400, 900);
		windowObj.setResizable(true);
		windowObj.setMaximizable(true);
		windowObj.center();
	};
	const delayShowWindow = (initFn, delay) => {
		//切换过渡登录界面切换到主界面或者从主界面切换到登陆页面，这时候直接变化大小看起来很奇怪，最好需要做点处理过渡一下
		win.setOpacity(0);
		initFn(win);
		// 在最小化之后修改size会无效，所以要在最小化之前修改大小
		win.minimize();
		setTimeout(() => {
			win.setOpacity(1);
			win.show();
			win.focus();
		}, delay);
	};
	win.on("ready-to-show", () => {
		win.show(); // 初始化后再显示
	});
	ipcMain.on("window-close", () => {
		win.close(); //关闭窗口
	});
	ipcMain.on("window-max", function () {
		//最大化
		if (win.isMaximized()) {
			win.restore();
		} else {
			win.maximize();
		}
	});
	ipcMain.on("window-min", function () {
		//最小化
		win.minimize();
	});
	ipcMain.on("showMainWindow", (event, delay = 500) => {
		if (delay) {
			delayShowWindow(initMainWindow, delay);
		} else {
			initMainWindow(win);
		}
	});
	ipcMain.on("log-loaded", (event, arg) => {
		console.log(arg, "log-loaded"); // message
	});
	ipcMain.on("showLoginWindow", (event, delay = 500) => {
		console.log(delay);
		if (delay) {
			delayShowWindow(initLoginWindow, delay);
			// initLoginWindow(win);
		} else {
			initLoginWindow(win);
		}
	});

	//delayShowWindow(initLoginWindow, 300);
	delayShowWindow(initMainWindow, 100);
	// ipcMain.handle("dialog:openFile", handleFileOpen);
	handleFileOpen();
	// hansPython();
	const logPath = path.join(__dirname, "../logs", "app.log");
	// 读取日志文件
	// fs.readFile(logPath, "utf-8", (err, data) => {
	// 	if (err) {
	// 		// console.error(err);
	// 		return;
	// 	}
	// });
	ipcMain.on("message-from-renderer", (event, arg) => {
		// setInterval(() => {
		event.reply("message-to-renderer", arg); // 向渲染进程发送消息
		// }, 2000);
	});

	//通信，主板序列号: 
	// bios序列号 5D6GKR2
	// cpu序列号: BFEBFBFF000806E9
	// pcid:D94A97CD94E356AE
	const zhuban = await getZhuBan();
	const bios = await getBios();
	const cpu = await getCpu();
	// const zhuban = '/5D6GKR2/CNCMC0088J008B/';
	// const bios = await '5D6GKR2';
	// const cpu = await 'BFEBFBFF000806E9';

	const str = zhuban + bios + cpu + 'gugechanggong';


	const encoder = new TextEncoder(); // 创建TextEncoder实例
	const bytes = encoder.encode(str)
	// console.log('bios', bytes)

	const crypto = require('crypto');
	const str1 = crypto.createHash('md5').update(bytes).digest('hex').toUpperCase()
	const pcid = str1.substr(8, 16)
	ipcMain.on("message-from-renderer-pcid", (event, arg) => {
		event.reply("message-to-renderer-pcid", pcid); // 向渲染进程发送消息
	});



};
// console.log('dirname',__dirname)

async function handleFileOpen() {
	// const array = [7, 15, 26, 58, 64];
	// console.log("array: ", array);
	// const byteArray = binding.CreateByteArray(array);
	// console.log("byteArray: ", byteArray);
	// const byteArray = Uint8Array.from([10, 20, 30, 50, 25, 17]);
	// console.log("byteArray: ", byteArray);
	// binding.AcceptByteArray(byteArray);
}



async function hansPython() {

	// 执行Python命令以获取版本
	exec('python --version', (error, stdout, stderr) => {
		if (error) {
			// 如果没有找到Python，则可能会有错误
			console.error(`执行的错误: ${error}`);
			console.error(`标准错误: ${stderr}`);
			// 检查错误以确定是否是因为Python未安装或路径设置不正确
		} else {
			// dialog.showMessageBox({
			// 	type: 'info',
			// 	title: 'Alert',
			// 	message: `Python版本是: ${stdout}`,
			// 	buttons: ['OK']
			// }).then(() => {
			// 	// 处理按钮点击事件，如果需要的话
			// });
			// 输出Python版本
			console.log(`Python版本是: ${stdout}`);
		}
	});

}


//获取主板信息
function getZhuBan() {
	return new Promise((resolve, reject) => {
		si.baseboard()
			.then(data => {
				resolve(data.serial)

			})
			.catch(error => console.error(error));
		// exec('dmidecode -t baseboard', (error, stdout, stderr) => {
		//   if (error) {
		//     console.error(`执行的错误: ${error}`);
		//     return;
		//   }
		//   if (stderr) {
		//     console.error(`执行的错误输出: ${stderr}`);
		//     return;
		//   }
		// 	console.log(stdout);
		// });
	});
}

//获取Bios信息
function getBios() {
	return new Promise((resolve, reject) => {
		// si.bios()
		// 	.then(data => {
		// 		resolve(data.serial)
		// 	})
		// 	.catch(error => console.error(error));
		exec('wmic bios get serialnumber', (error, stdout, stderr) => {
			if (error) {
				console.error(`执行的错误: ${error}`);
				return;
			}
			if (stderr) {
				console.error(`stderr: ${stderr}`);
				return;
			}
			// 输出BIOS序列号，通常在第二行
			resolve(stdout.split('\r\r\n')[1].trim())
		});
	});
}
//获取Cpu信息
function getCpu() {
	return new Promise((resolve, reject) => {
		// si.cpu()
		// 	.then(data => {
		// 		// data.cores是一个数组，包含每个核心的信息
		// 		console.log(`CPU序列号:`, data);
		// 		data.cores.forEach(core => {
		// 			console.log(`CPU序列号: ${core.serialNumber}`);
		// 		});
		// 	})
		// 	.catch(error => console.error(error));


		exec('wmic cpu get ProcessorId', (error, stdout, stderr) => {
			if (error) {
				console.error(`执行的错误: ${error}`);
				return;
			}
			// console.log(stdout);
			// 输出可能包含换行符，我们需要去除它们
			// const cpuId = stdout.trim();
			// console.log(cpuId);
			// console.log(stdout.split('\r\r\n')[1].trim());
			resolve(stdout.split('\r\r\n')[1].trim())
		});
	});
}

function checkForUpdates() {

	// 你需要替换为你的更新服务器地址
	const server = 'https://gitee.com/lxj1989/hym-user-pc-electron/releases/tag'; //v1.0.1
	const feed = `${server}/v${app.getVersion()}/latest.yml`;
	console.log(feed)
	autoUpdater.setFeedURL(feed);
	autoUpdater.checkForUpdates();
}

autoUpdater.on('error', (error) => {
	console.error(error);
});

autoUpdater.on('update-available', async () => {
	console.log('更新可用，正在下载...');
	const { version } = info
	const { response, checkboxChecked } = await dialog.showMessageBox({
		type: 'info',
		buttons: ['关闭', '跳过这个版本', '安装更新'],
		title: '软件更新提醒',
		message: `最新版本是 ${version}，您现在的版本是 ${app.getVersion()}，现在要下载更新吗？`,
		defaultId: 2,
		cancelId: -1,
		checkboxLabel: '以后自动下载并安装更新',
		checkboxChecked: false,
		textWidth: 300,
	})
	if ([1, 2].includes(response)) {
		let updaterData = {
			version: version,
			skip: response === 1,
			auto: checkboxChecked,
		}
		setLocalData({
			updater: {
				...updaterData,
			},
		})
		if (response === 2) autoUpdater.downloadUpdate()
		// logger.info(['更新操作', JSON.stringify(updaterData)])
	} else {
		// logger.info(['更新操作', '关闭更新提醒'])
	}
});

autoUpdater.on('update-not-available', () => {
	console.log('没有发现新的更新');
});

autoUpdater.on('update-downloaded', () => {
	console.log('更新已下载，准备安装');

	// 通知用户更新已经准备好，并且可以重新启动应用程序来应用更新
});
app.whenReady().then(() => {
	createWindow();
	// checkForUpdates();
});
